#include <vector>
#include <iostream>
#include <functional>
#include <algorithm>

// template <typename R, typename F>
// auto operator|(R&& r, F&& f) {
//     for (auto&& x: r)
//         f(x);
//     return r;
// }

template<typename U, typename F>
    // requires std::regular_invocable<F, U&>//可加可不加，不会就不加
std::vector<U>& operator|(std::vector<U>& v1, F f) {
    for (auto& i : v1) {
        f(i);
    }
    return v1;
}

int main(){
    std::vector v{1, 2, 3};
    std::function f {[](const int& i) {std::cout << i << ' '; } };
    auto f2 = [](int& i) {i *= i; };
    v | f2 | f;
}